package org.sakai.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import org.sakai.entity.Message;

import java.util.List;
import java.util.Map;

/**
 * @author Sakai
 * @description 针对表【message】的数据库操作Mapper
 * @createDate 2025-06-26 19:31:26
 * @Entity org.sakai.entity.Message
 */
@Mapper
public interface MessageMapper {

    int deleteByPrimaryKey(String id);

    int insert(Message record);

    int insertSelective(Message record);

    Message selectByPrimaryKey(String id);

    int updateByPrimaryKeySelective(Message record);

    int updateByPrimaryKey(Message record);

    /**
     * 根据问诊ID获取消息列表
     * @param consultId 问诊ID
     * @param lastTime 最后一条消息时间
     * @return 消息列表
     */
    List<Message> selectMessagesByConsultId(@Param("consultId") String consultId,
                                            @Param("lastTime") String lastTime);

    /**
     * 统计问诊的消息数量
     * @param consultId 问诊ID
     * @return 消息数量
     */
    Integer countMessagesByConsultId(@Param("consultId") String consultId);

    /**
     * 获取用户的消息列表（会话列表）
     * @param userId 用户ID
     * @return 消息列表
     */
    List<Map<String, Object>> selectMessageListByUserId(@Param("userId") String userId);

    /**
     * 根据用户ID获取用户头像
     * @param userId 用户ID
     * @return 头像URL
     */
    String selectUserAvatarById(@Param("userId") String userId);

    /**
     * 获取用户未读消息总数
     * @param userId 用户ID
     * @return 未读消息数量
     */
    Integer selectUnreadMessageCountByUserId(@Param("userId") String userId);

    /**
     * 获取指定会话的未读消息数量
     * @param consultId 问诊ID
     * @param userId 用户ID
     * @return 未读消息数量
     */
    Integer selectUnreadMessageCountByConsultAndUser(@Param("consultId") String consultId, 
                                                     @Param("userId") String userId);

    /**
     * 标记指定会话的所有消息为已读
     * @param consultId 问诊ID
     * @param userId 用户ID
     * @return 更新的消息数量
     */
    Integer markMessagesAsReadByConsultAndUser(@Param("consultId") String consultId, 
                                               @Param("userId") String userId);

    /**
     * 清除用户所有未读消息
     * @param userId 用户ID
     * @return 更新的消息数量
     */
    Integer clearAllUnreadMessagesByUser(@Param("userId") String userId);

    @Update("UPDATE message \n" +
            "SET status = '已读' \n" +
            "WHERE consult_id = (\n" +
            "    SELECT * FROM (\n" +
            "        SELECT consult_id FROM message WHERE id = #{messageId}\n" +
            "    ) AS tmp\n" +
            ")\n" +
            "AND status = '未读';")
    Integer updateMessageStatus(@Param("messageId") String messageId);

    /**
     * 获取指定会话的最新消息
     * @param consultId 问诊ID
     * @return 最新消息信息
     */
    Map<String, Object> selectLatestMessageByConsultId(@Param("consultId") String consultId);

    /**
     * 获取指定会话的未读消息数量
     * @param consultId 问诊ID
     * @param userId 用户ID
     * @return 未读消息数量
     */
    Integer selectUnreadCountByConsultId(@Param("consultId") String consultId, @Param("userId") String userId);

    /**
     * 批量获取多个会话的最新消息
     * @param consultIds 问诊ID列表
     * @return 最新消息列表
     */
    List<Map<String, Object>> selectLatestMessagesByConsultIds(@Param("consultIds") List<String> consultIds);

    /**
     * 批量获取多个会话的未读消息数量
     * @param consultIds 问诊ID列表
     * @param userId 用户ID
     * @return 未读消息数量列表
     */
    List<Map<String, Object>> selectUnreadCountsByConsultIds(@Param("consultIds") List<String> consultIds, @Param("userId") String userId);

    /**
     * 获取用户基本信息
     * @param userId 用户ID
     * @return 用户信息
     */
    Map<String, Object> selectUserInfoById(@Param("userId") String userId);

    /**
     * 获取患者基本信息
     * @param patientId 患者ID
     * @return 患者信息
     */
    Map<String, Object> selectPatientInfoById(@Param("patientId") String patientId);

    /**
     * 简单测试查询 - 获取用户的问诊记录
     * @param userId 用户ID
     * @return 问诊记录数量
     */
    Integer testSelectConsultsByUserId(@Param("userId") String userId);
}
